"""
 1.socket创建一个套接字
 2.bind绑定ip和port
 3.listen使套接字设置为被动模式
 4.accept等待客户端的链接
 5.recv/send接收并发送数据   
    
"""
import sys
import socket
import threading
import utils#自己创建的译码工具
def recv_handle(tcp_client,tcp_client_addr):
    tcp_client.send(f"欢迎光临：".encode())
    while True:
            #5.recv/send接收并发送数据
            client_data = tcp_client.recv(1024)
            if client_data:
                print("客户端发来数据:",utils.decode_data(client_data))

                #服务器回复数据
                tcp_client.send("消息已收到！".encode('utf-8'))
            else:
                #收到空内容说明客户端断开连接
                print(client_data,type(client_data))
                print("客户端断开连接",tcp_client_addr)
                #释放为这个客户端创建的socket套接字对象
                tcp_client.close()
                break
def main():
    #1.socket创建一个套接字
    #AF_INET: IPv4地址,SOCK_STREAM: TCP协议
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print(tcp_server_socket)

    #2.bind绑定ip和port
    #如果ip是空字符串，代表所有本机网卡的ip地址
    #tcp_server_socket.bind(('127.0.0.1',7788))
    tcp_server_socket.bind(('',7788))

    #3.listen使套接字设置为被动模式
    #参数：等待客户端连接的最大数量，旨在windows系统里生效，其他系统不限制
    #此时，socket套接字对象由主动连接模式变为被动模式，等待客户端接入
    tcp_server_socket.listen(128)
    
    index = 0

    print("--------------服务器启动，等待客户端连接--------------")
    while True:
        #4.accept等待客户端的连接（阻塞当前线程，有新客户接入时才释放阻塞）
        tcp_client,client_addr = tcp_server_socket.accept()#解包
        print("有新的客户来啦!:",client_addr)
        
        #arsg:
        t1 = threading.Thread(target=recv_handle,args=(tcp_client,client_addr,name = f"客户端{index}"))
        t1.daemon = True#设置为守护线程，主线程结束时，子线程也结束
        t1.start()

        
    #6关闭服务器
    #关闭tcp服务器套接字，不再接收新的客户端接入
    #已经连接的客户端socket对象不受影响
    tcp_server_socket.close()
if __name__ == "__main__":
    main()